package cn.lumora.core.security.token;

import cn.lumora.core.util.RedisService;
import cn.lumora.core.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * 临时令牌服务，管理一次性使用的临时令牌
 */
@Service
@Slf4j
public class TempTokenService {

    // 常量定义
    private static final String TEMP_TOKEN_PREFIX = "temp_token:"; // 临时令牌键前缀
    private static final int TEMP_TOKEN_EXPIRE_MINUTES = 5; // 令牌有效期（分钟）

    private final RedisService redisService;

    public TempTokenService(RedisService redisService) {
        this.redisService = redisService;
    }

    /**
     * 生成临时令牌
     *
     * @param username 用户名
     * @return 生成的临时令牌
     */
    public String generateTempToken(String username) {
        // 生成唯一标识符作为令牌
        String tempToken = UUID.randomUUID().toString().replace("-", "");

        // 构造Redis键
        String key = TEMP_TOKEN_PREFIX + tempToken;

        // 将临时令牌与用户名绑定，设置较短过期时间
        redisService.setEx(
                key,
                username,
                TEMP_TOKEN_EXPIRE_MINUTES * 60 // 转换为秒
        );

        return tempToken;
    }

    /**
     * 验证并获取用户名
     *
     * @param tempToken 临时令牌
     * @return 绑定的用户名，验证失败返回null
     */
    public String validateAndGetUsername(String tempToken) {
        try {
            String key = TEMP_TOKEN_PREFIX + tempToken;

            // 从Redis获取绑定的用户名
            String username = redisService.get(key);

            if (username != null) {
                // 一次性使用，立即删除
                RedisUtil.del(key);
            }

            return username;
        } catch (Exception e) {
            log.error("验证临时令牌失败,{}", e.getMessage());
            throw new RuntimeException("验证临时令牌失败");
        }
    }
}
